/*
 * Attribut.h
 *
 *  Created on: Jun 9, 2013
 *      Author: juliendubois
 */

#ifndef ATTRIBUT_H_
#define ATTRIBUT_H_

#include <stdexcept>

using std::out_of_range;

namespace Attribut {

const static double maxAttribut = 100.0;
const static double minAttribut = 0.0;

class Attribut {
protected:
	double valeur;

public:
	/**
	 * Constructeur
	 */
	Attribut(double valeur) {
		if (valeur <= maxAttribut && valeur >= minAttribut)
			this->valeur = valeur;
		else
			throw new out_of_range("Erreur lors de la construction d'un attribut");
	};

	/**
	 * Destructeur
	 */
	virtual ~Attribut() {};
};

class AttributArmure : public Attribut {
public:
	AttributArmure(double valeur) : Attribut(valeur) {};
	virtual ~AttributArmure() {};

	double absorbe(double degats, double penetration);
};

class Endurance : public Attribut {
public:
	Endurance(double valeur) : Attribut(valeur) {};
	virtual ~Endurance() {};

	void subit(double degats);
};

class AttributCritique : public Attribut {
protected:
	double critique;

	double getRandValue();

public:
	AttributCritique(double valeur, double critique) : Attribut(valeur) {
		if (valeur <= maxAttribut/2 && valeur >= minAttribut)
			this->critique = critique;
		else
			throw new out_of_range("Erreur lors de la construction d'un attribut critique");
	};
	virtual ~AttributCritique() {};
};

class PenetrationArmure : public AttributCritique {
public:
	PenetrationArmure(double valeur) : AttributCritique(valeur, 10.0) {};
	virtual ~PenetrationArmure() {};

	double getPenetration();
};

class Esquive : public AttributCritique {
public:
	Esquive(double valeur) : AttributCritique(valeur, 30.0) {};
	virtual ~Esquive() {};

	bool esquive(double precision);
};

class Force : public AttributCritique {
public:
	Force(double valeur, double critique) : AttributCritique(valeur, critique) {};
	virtual ~Force() {};

	double attaque();
};

class Precision : public AttributCritique {
public:
	Precision(double valeur) : AttributCritique(valeur, 20.0) {};
	virtual ~Precision() {};

	double tir();
};

}  // namespace Attribut

#endif /* ATTRIBUT_H_ */
